﻿//this file must use utf8 without BOM
//中文测试
grammar ttlang;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//文档可用的元素
root:(title|doc_value_def|doc_class_def|doc_struct_def|doc_method_def|doc_enum_def|comment|empty_line)* EOF;

comment:COMMENTSINGLE|COMMENTMUL;
title:TITLE; //# 标签功能
empty_line:';';


idchain:(INNERTYPE|ID) ('.' ID)?;
arraytype:idchain('[' (DIGIT)? ']');
tupeltype:'[' type (',' type)* ']';
type: idchain|arraytype|tupeltype;

modifier : 'export'| 'const'|'share';


doc_value_def:ID (':' type)? ('=' expr)?;//文档变量定义
doc_method_def:('export')? ID '(' (param_def (',' param_def )*)? ')' (':'type)?  code_block; //文档函数定义

doc_class_def:(modifier)? 'class' ID '{' ((codeelem_value_def )|doc_method_def)* '}'; //文档类定义，未完成
doc_struct_def:(modifier)? 'struct' ID '{' ((codeelem_value_def )|doc_method_def)* '}'; //文档结构定义，未完成

enum_item:ID ('=' number)?;
doc_enum_def: (modifier)? 'enum' ID (':'type)? '{' enum_item+ '}';

param_def: ID ':' type;


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

code_block:'{' (title|comment|empty_line|code_atom)* '}';
//代码定义
code_atom:
(codeelem )//一般的代码行
|code_return //返回语句
|code_block_if|code_block_for|code_block_while|code_block_dowhile|code_block_switch//各种分支语句
|code_block;

//代码片段：定义、赋值、自操作|
codeelem:codeelem_value_def|codeelem_set|codeelem_selfop|codeelem_call;
codeelem_value_def:'var' ID (':' type)? ('=' expr)?;//定义
codeelem_set: ID '=' expr;//赋值
codeelem_selfop: ID SELF_TOKEN expr? ;//自操作
codeelem_call: expr_call;//调用


code_block_if:'if' '(' expr ')' code_block|LEND  ('else' code_atom)?;
code_block_for:'for' '('codeelem ';'  expr ';' codeelem ')' code_atom ;
code_block_while:'while' '(' expr ')' code_atom;
code_block_dowhile:'do'  code_atom 'while' '(' expr ')';
code_block_switch:'switch' '(' ID ')' '{' ('case'':' code_atom)+ ('default'':' code_atom )? '}';
code_return: 'return' expr ;//

number:INT|FLOAT|HEX|BIN;

//表达式的特点是必须有值，++a 和 a++ 这种干扰操作直接在ttlang 中不作为表达式
//一元表达式无返回a++，二元表达式无返回a+=3
//三元表达式有返回 a?1|2
//数学表达式有返回,数学表达式有 四则优先级
expr:number|STRING|idchain|expr_sign|expr_op3|expr_math|expr_call|expr_group|expr_array;
expr_sign: ('-'|'!'|'&') expr;
expr_op3: (idchain|expr_call|expr_group) '?' expr  ':' expr; //三元表达式,//带着op3，会让expr_op3 左递归
expr_math:(number|idchain|expr_call|expr_math_h|expr_group) MATH_TOKEN expr;//数学表达式
expr_math_h:(number|idchain|expr_call|expr_group) MATH_TOKEN_H expr;
expr_call:idchain '('(expr (',' expr)* )? ')';//调用表达式
expr_group:'(' expr ')';
expr_array:('[' ']')|('[' expr (','expr)* ']');
/////////////////////////////////////////////////////////////////////
//lex part
INNERTYPE:'int'|'bool'|'float'|'double'|'uint8'|'uint16'|'uint32'|'uint64'|'int8'|'int16'|'int32'|'int64'|'u8str'|'u16str';

KEYWORD:'for'|'if'|'else'|'var'|'do';
ID:[_a-zA-Z][_a-zA-Z0-9]* ;
INT:'-'?DIGIT;
FLOAT:INT '.' DIGIT;
HEX:'0x'([0-9]|'a'|'b'|'c'|'d'|'e'|'f'|'A'|'B'|'C'|'D'|'E'|'F')+;
BIN:'0b'([0-1])+;
DIGIT:[0-9]+;

STRING:			('"' ('\\"'|.)*? '"'  ) | ('\''('\\\''|.)*? '\''  );
//c 系语言，直接把空行去掉
SELF_TOKEN:('++'|'--'|'+='|'-='|'*='|'/='|'&='|'|=');
MATH_TOKEN: '+'|'-' |'&&' |'||' |'>'|'<'|'>='|'<='|'=='|'!=';
MATH_TOKEN_H:'*'|'/'|'%'|'^';
TOKEN_MUL:'*'|'/';
TOKEN_ADD : '+'|'-';

/*asdf \*\/  */
WS	:	((' '|[\t\r\n]))+ ->skip; //WHITE SPACE 
TITLE: '#' .*? ('\r'|'\n'|EOF); //#之后一行都完蛋
COMMENTSINGLE: '//'.*? ('\r'|'\n'|EOF);
COMMENTMUL:'/*' .*? '*/';
LEND : ';';

//定一个UNKNOWN 来识别未处理的字符,如果出现Unknown一定有识别错误
UNKNOWN__ : .;